1、盛最多的水
思想：双指针法，开始l为最左边指针，r为最右边指针，当l>r时停止，这样ans=min(v[l],v[r])*(r-l);
class Solution {
public:
    int maxArea(vector<int>& height) {
        int l=0;
        int r=height.size()-1;
        int ans=0;
        while(l<r)
        {
            int tmp=min(height[l],height[r])*(r-l);
            if(ans<tmp)
                ans=tmp;
            if(height[l]>height[r])
                r--;
            else
                l++;
        }
        return ans;
    }
};

2、正则表达式匹配
思想：动态规划
f(i,j)表示s的前i个字符与p的前j个字符是否匹配，可以分2大情况讨论
当p的第j个字符是*时
当p的第j个字符不是*时
class Solution {
public:
    bool isMatch(string s, string p) {
        vector<vector<bool>> vv(s.size()+1,vector<bool>(p.size()+1,false));
        vv[0][0]=true;
        //初始化，
        for(int j=2;j<=p.size();j+=2)
        {
            vv[0][j]=vv[0][j-2]&&p[j-1]=='*';
        }
        for(int i=1;i<=s.size();i++)
        {
            for(int j=1;j<=p.size();j++)
            {
                //表示p里面第j个字符为*时
                if(p[j-1]=='*')
                {
                    //表示p里面的第j-1个字符出现0次时
                    if(vv[i][j-2])
                        vv[i][j]=true;
                    //表示第j-1个字符出现1次
                    else if(vv[i-1][j]&&s[i-1]==p[j-2])
                        vv[i][j]=true;
                    else if(vv[i-1][j]&&p[j-2]=='.')
                        vv[i][j]=true;
                }
                else
                {
                    if(vv[i-1][j-1]&&s[i-1]==p[j-1])
                        vv[i][j]=true;
                    else if(vv[i-1][j-1]&&p[j-1]=='.')
                        vv[i][j]=true;
                }
            }
        }
        return vv[s.size()][p.size()];
    }
};